/**
 * @file display.h
 * @brief OLED显示屏控制模块头文件
 */

#ifndef DISPLAY_H
#define DISPLAY_H

#include <Arduino.h>
#include "led.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <U8g2lib.h>
#include "config.h"
#include "buttons.h" // 包含buttons.h来获取ButtonType定义

extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
extern bool g_displayInitialized; // OLED显示屏初始化状态标志

// 显示页面枚举
enum DisplayPage
{
    PAGE_MAIN = 0,        // 主页面
    PAGE_SPECTRUM,        // 频谱页面
    PAGE_SETTINGS,        // 设置页面
    PAGE_EFFECT_SELECT,   // 效果选择页面
    PAGE_COLOR_SELECT,    // 颜色选择页面
    PAGE_BRIGHTNESS,      // 亮度调节页面
    PAGE_GAIN,            // 声音增益页面
    PAGE_LED_MODE,        // 灯带模式页面
    PAGE_SEGMENTS,        // 灯带分段页面
    PAGE_LEDS_PER_SEG,    // 每段LED数页面
    PAGE_NOISE_THRESHOLD, // 噪声阈值页面
    PAGE_SPECTRUM_SMOOTHING,  // 频谱平滑系数页面
    PAGE_RISE_SPEED,          // 频谱上升速度页面
    PAGE_FALL_SPEED,          // 频谱下降速度页面
    PAGE_PEAK_DECAY,          // 峰值衰减速度页面
    PAGE_PEAK_DOT_DECAY,      // 峰值点衰减速度页面
    PAGE_PEAK_HOLD_TIME,      // 峰值点停留时间页面
    PAGE_IMPACT_SPEED,        // 冲击速度页面
    PAGE_MAX_IMPACT_DISTANCE, // 最大冲击距离页面
    PAGE_COLOR_CYCLE_TIME,    // 颜色循环时间页面
    PAGE_LOG_SCALE,           // 对数尺度系数页面
    PAGE_FAST_DECAY_RATE,     // 快速衰减率页面
    PAGE_LOW_FREQ_COMP,      // 低频补偿系数页面
    PAGE_MID_FREQ_COMP,      // 中频补偿系数页面
    PAGE_HIGH_MID_FREQ_COMP, // 中高频补偿系数页面
    PAGE_HIGH_FREQ_COMP,     // 高频补偿系数页面
    PAGE_LOW_FREQ_NOISE,      // 低频噪声阈值页面
    PAGE_MID_FREQ_NOISE,      // 中频噪声阈值页面
    PAGE_HIGH_MID_FREQ_NOISE, // 中高频噪声阈值页面
    PAGE_HIGH_FREQ_NOISE,     // 高频噪声阈值页面
    PAGE_SPECTRUM_COMPRESSION, // 频谱压缩比例页面
    PAGE_BASS_BANDS,     // 低音频段数量页面
    PAGE_MID_BANDS,      // 中音频段数量页面
    PAGE_HIGH_MID_BANDS, // 中高音频段数量页面
    PAGE_TREBLE_BANDS,   // 高音频段数量页面
    PAGE_BEAT_SENSITIVITY,  // 节拍灵敏度页面
    PAGE_BEAT_THRESHOLD,    // 节拍阈值页面
    PAGE_BEAT_DECAY_RATE,   // 节拍衰减率页面
    PAGE_BEAT_MIN_INTERVAL, // 最小节拍间隔页面
    PAGE_BEAT_BOOST_FACTOR, // 节拍增强因子页面
    PAGE_RESET, // 重置设置页面
    PAGE_FREQ_UPPER_LIMIT, // 频率上限页面
    PAGE_FFT_WINDOW_TYPE, // FFT窗函数类型页面
    PAGE_PEAK_DOT_COUNT, // 峰值点数量页面
    PAGE_PEAK_DOT_COLOR, // 峰值点颜色页面
    PAGE_COUNT // 页面数量
};

// 设置菜单项枚举
enum SettingsMenuItem
{
    MENU_EFFECT = 0,   // 效果选择
    MENU_COLOR,        // 颜色选择
    MENU_BRIGHTNESS,   // 亮度调节
    MENU_GAIN,         // 声音增益
    MENU_LED_MODE,     // 灯带模式
    MENU_SEGMENTS,     // 灯带分段
    MENU_LEDS_PER_SEG, // 每段LED数
    MENU_SPECTRUM_SMOOTHING, // 频谱平滑系数
    MENU_RISE_SPEED,         // 频谱上升速度
    MENU_FALL_SPEED,         // 频谱下降速度
    MENU_PEAK_DECAY,         // 峰值衰减速度
    MENU_PEAK_DOT_DECAY,      // 峰值点衰减速度
    MENU_PEAK_HOLD_TIME,      // 峰值点停留时间
    MENU_IMPACT_SPEED,        // 冲击速度
    MENU_MAX_IMPACT_DISTANCE, // 最大冲击距离
    MENU_COLOR_CYCLE_TIME,    // 颜色循环时间
    MENU_LOG_SCALE,           // 对数尺度系数
    MENU_FAST_DECAY_RATE,     // 快速衰减率
    MENU_LOW_FREQ_COMP,      // 低频补偿系数
    MENU_MID_FREQ_COMP,      // 中频补偿系数
    MENU_HIGH_MID_FREQ_COMP, // 中高频补偿系数
    MENU_HIGH_FREQ_COMP,     // 高频补偿系数
    MENU_LOW_FREQ_NOISE,      // 低频噪声阈值
    MENU_MID_FREQ_NOISE,      // 中频噪声阈值
    MENU_HIGH_MID_FREQ_NOISE, // 中高频噪声阈值
    MENU_HIGH_FREQ_NOISE,     // 高频噪声阈值
    MENU_SPECTRUM_COMPRESSION, // 频谱压缩比例
    MENU_BASS_BANDS,     // 低音频段数量
    MENU_MID_BANDS,      // 中音频段数量
    MENU_HIGH_MID_BANDS, // 中高音频段数量
    MENU_TREBLE_BANDS,   // 高音频段数量
    MENU_BEAT_SENSITIVITY,  // 节拍灵敏度
    MENU_BEAT_THRESHOLD,    // 节拍阈值
    MENU_BEAT_DECAY_RATE,   // 节拍衰减率
    MENU_BEAT_MIN_INTERVAL, // 最小节拍间隔
    MENU_BEAT_BOOST_FACTOR, // 节拍增强因子
    MENU_FREQ_UPPER_LIMIT, // 频率上限
    MENU_PEAK_DOT_COUNT, // 峰值点数量
    MENU_PEAK_DOT_COLOR, // 峰值点颜色
    MENU_RESET,      // 重置设置
    MENU_ITEMS_COUNT // 菜单项数量
};

// 七彩颜色菜单项枚举
enum RainbowMenuItem {
    RAINBOW_TYPE = 0,      // 类型（全彩/冷色/暖色）
    RAINBOW_SPEED = 1,     // 速度（1-100%）
    RAINBOW_SMOOTHNESS = 2,// 平滑（1-100%）
    RAINBOW_DIRECTION = 3, // 方向（8种）
    RAINBOW_MENU_COUNT = 4
};

// 渐变颜色菜单项枚举
enum GradientMenuItem {
    GRADIENT_SPEED = 0,    // 速度（1-100%）
    GRADIENT_SMOOTHNESS = 1,// 平滑（1-100%）
    GRADIENT_MENU_COUNT = 2
};

// 菜单层级枚举
enum MenuLevel {
    MENU_LEVEL_CATEGORY = 0,
    MENU_LEVEL_ITEM = 1
};

extern uint8_t currentMenuLevel;

// 数据类型枚举 
enum DataType {
    DTYPE_UINT8 = 0,
    DTYPE_FLOAT = 1,
    DTYPE_BOOL = 2,
    DTYPE_ENUM = 3
};

// 菜单项配置结构
struct MenuItemConfig {
    const char* name;
    void* configPtr;
    DataType dataType;
    float minValue;
    float maxValue;
    float stepSize;
    const char* unit;
    const char** enumNames;
    uint8_t enumCount;
};

// 参数配置结构体定义（只保留一份）
struct ParamConfig {
    enum ParamType {
        INT,
        FLOAT,
        ENUM
    } type;
    ConfigItem configItem;
    void (*callback)();
};

// 参数配置数组声明（只声明，不定义）
extern const uint8_t PARAM_CONFIGS_COUNT;
extern const ParamConfig paramConfigs[];

// 按钮长按配置
#define LONG_PRESS_TIME     800     // 长按触发时间(ms)
#define REPEAT_INTERVAL     150     // 长按重复间隔(ms)

// 扩展ButtonState枚举值（为了兼容新的按钮状态）
#define BTN_NONE            BUTTON_IDLE
#define BTN_SHORT_PRESS     BUTTON_PRESSED
#define BTN_LONG_PRESS      BUTTON_LONG_PRESSED
#define BTN_REPEAT          BUTTON_LONG_PRESSED

// ==================== 函数声明 ====================

/**
 * @brief 初始化OLED显示屏
 */
bool initDisplay();

/**
 * @brief 清除显示屏
 */
void clearDisplay();

/**
 * @brief 更新显示内容
 */
void updateDisplay();

/**
 * @brief 设置当前显示页面
 */
void setDisplayPage(DisplayPage page);

/**
 * @brief 获取当前显示页面
 */
DisplayPage getCurrentPage();

/**
 * @brief 通用二级菜单显示函数
 */
void displayCurrentMenu();

/**
 * @brief 通用参数编辑显示函数  
 */
void displayParameterEdit(uint8_t menuItemIndex, bool isEditing);

/**
 * @brief 绘制进度条
 */
void drawProgressBar(uint8_t x, uint8_t y, uint8_t width, uint8_t height, 
                    float value, float minVal, float maxVal);

// 特殊页面函数
void showMainPage(uint8_t volume, bool noiseDetected);
void showSpectrumPage(float* bandValues, uint8_t bands);
void showSavingPage(bool saving);
void showResettingPage(bool resetting);
void showSplashScreen();
void showAboutPage();
void showEffectSelectPage(LEDEffectMode selectedEffect);
void showColorSelectPage(uint8_t selectedColor);
void showParamPage(uint8_t menuIdx);
void showSettingsPage(uint8_t selectedItem);
void drawCategoryList();
void drawItemList();
void showRainbowParamEditPage(RainbowMenuItem item);
void showGradientParamEditPage(GradientMenuItem item);

// CPU使用率函数
float getMCUCPUUsage();

// 按钮状态检测
ButtonState getButtonStateWithLongPress(ButtonType buttonType);

// 参数调整函数
void adjustParameterWithLongPress(uint8_t menuItemIndex, bool increase, bool isLongPress);

// 全局变量声明
extern const uint8_t TOTAL_REORGANIZED_MENU_ITEMS;

#endif // DISPLAY_H